package edu.uaskl.jqf.algorithm;

import java.util.ArrayList;
import java.util.List;

import edu.uaskl.jqf.algorithm.interfaces.Algorithm;
import edu.uaskl.jqf.model.gates.DeutschBlackBox;
import edu.uaskl.jqf.model.gates.interfaces.Gate;
import edu.uaskl.jqf.model.gates.util.Gates;

public class Deutsch implements Algorithm {

    private final DeutschBlackBox deutschBlackBox;

    public Deutsch(final DeutschBlackBox deutschBlackBox) {
        this.deutschBlackBox = deutschBlackBox;
    }

    @Override
    public List<Gate> getGates() {
        final List<Gate> gates = new ArrayList<>();
        gates.add(Gates.HADAMARD);
        gates.add(deutschBlackBox);
        gates.add(Gates.HADAMARD);
        return gates;
    }
    //    public QuRegister apply2(final QuRegister quRegister) {
    //        QuRegister quRegisterResult = quRegister.applyAlgorithm(new Algorithm() {
    //            @Override
    //            public Qubit apply(final Qubit qubit) {
    //                return Hadamard.size2.multiply(qubit);
    //            }
    //        });
    //        System.out.println(quRegisterResult);
    //        final List<Qubit> result = new ArrayList<>(quRegisterResult.getQubits());
    //
    //        final Qubit x = result.get(0);
    //
    //        final Complex alpha = x.getAlpha();
    //        final Complex beta = x.getBeta();
    //
    //        //        final int result0 = deutschBlackBox.apply(0);
    //        //        final int result1 = deutschBlackBox.apply(1);
    //
    //        //        final Complex newAlpha = alpha.multiply(1 - result0 * 2);
    //        //        final Complex newBeta = beta.multiply(1 - result1 * 2);
    //
    //        //        final Qubit q1 = new Qubit(newAlpha, newBeta);
    //
    //        //        result.set(0, q1);
    //
    //        quRegisterResult = new QuRegister(result);
    //        System.out.println(quRegisterResult);
    //
    //        quRegisterResult = quRegisterResult.applyAlgorithm(new Algorithm() {
    //            @Override
    //            public Qubit apply(final Qubit qubit) {
    //                return Hadamard.size2.multiply(qubit);
    //            }
    //        });
    //        return quRegisterResult;
    //    }

    //    @Override
    //    public QuRegister apply(final QuRegister quRegister) {
    //        QuRegister quRegisterResult = quRegister.applyAlgorithm(new Algorithm() {
    //            @Override
    //            public Qubit apply(final Qubit qubit) {
    //                return Hadamard.size2.multiply(qubit);
    //            }
    //        });
    //        //        final int resultFor0 = deutschBlackBox.apply(0);
    //        //        final int resultFor1 = deutschBlackBox.apply(1);
    //        //
    //        //        final MatrixComplex matrixForX = new MatrixComplex(new double[][] { { 1 - resultFor0, -resultFor0 }, { -resultFor1, 1 - resultFor1 } });
    //
    //        final List<Qubit> result = quRegisterResult.getQubits();
    //        final Qubit x = result.get(0);
    //        final Qubit y = result.get(1);
    //
    //        //        quRegisterResult = new QuRegister(matrixForX.multiply(x), y);
    //
    //        quRegisterResult = quRegisterResult.applyAlgorithm(new Algorithm() {
    //            @Override
    //            public Qubit apply(final Qubit qubit) {
    //                return Hadamard.size2.multiply(qubit);
    //            }
    //        });
    //        return quRegisterResult;
    //    }
}
